<?php

function isAndroid() {
    if (strstr($_SERVER['HTTP_USER_AGENT'], 'Android')) {
        return 1;
    }
    return 0;
}

function isApple() {
    if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone')) {
        return 1;
    }
    return 0;
}

/**
 * 根据area_id 获取对应的地区的名称
 * @param integer $id 地区id
 * @return string 地区名称area_name
 */
function getAreaName($id = null) {
    $mArea = M('area');
    $name = $mArea->where(array('status' => 1, 'area_id' => $id))->getField('area_name');

    return $name;
}

/**
 * 获取专家领域名称
 * @author zhouzhi <zhouz@golive.cc>
 * @param integer $id 领域id
 * @return string  领域名称
 */
function getTerrName($id = null) {
    $mTeer = M('website_territory');
    $name = $mTeer->where(array('id' => $id))->getField('name');
    return $name;
}

/**
 * 获取项目名称
 * @param type $id 项目id
 * @return string
 */
function getItem($id = null) {
    $name = M('website_news')->where(array('id' => $id))->getField('title');
    if (!empty($name)) {
        return (mb_substr($name,0, 13,'UTF-8'));
    } else {
        $name = '';
        return $name;
    }
}

/**
 * 获取项目类型名称
 * @param type $id 
 * @return string
 */
function getTypeName($id = null) {
    $type = M('website_news_extend')->where(array('tid' => $id))->getField('t_7');
    return $type;
}


/**
 * 往日志文件中写日志
 * @param string $data  写入的数据
 * @param const $level  消息显示类型
 * @param string $dirName 目录名称 只需写目录名称不需要完整的路径
 */
function wLog($data, $dirName = '', $logFileName = '') {
    if (OPEN_LOG_WRITE == false) {
        return;
    }

    if (!$logFileName) {
        $logFileName = date('Y-m-d');
    }
    
    $dirName = $dirName ? $dirName . '/' : '';    //目录名称
    if (!is_dir(LOG_PATH . $dirName)) {
        mkdir(LOG_PATH . $dirName, 0777);
    }

    $destionation = LOG_PATH . $dirName . $logFileName . '.log'; //自定义的log日志路径
    $level = Log::DEBUG;  //错误日志级别

    Log::write($data, $level, '', $destionation);
}

/**
 * Service函数用于实例化Service 格式：[项目://][分组/]模块
 * @param string $name Service资源地址
 * @param array  $params 参数数组
 * @param string $layer Service层名称
 * @return Service|false
 */
function Service($name, $layer='', $params = array()) {
    static $_service = array();
    
    $layer      =   $layer ? $layer : C('DEFAULT_S_LAYER');
    if(strpos($name,'://')) {// 指定项目
        $name   =  str_replace('://','/'.$layer.'/',$name);
    }else{
        $name   =  '@/'.$layer.'/'.$name;
    }
    
    if(isset($_service[$name])) {
        return $_service[$name];
    }
    
    import($name.$layer);
    $class      =   basename($name.$layer);
    if(class_exists($class)) {
        $service = !empty($params) ? new $class($params) : new $class();
        $_service[$name] = $service;
        return $service;
    } else {
        return false;
    }
}

/**
 * 获取当前IP地址
 */
function getIP() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
        $cip = $_SERVER["HTTP_CLIENT_IP"];
    } elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } elseif (!empty($_SERVER["REMOTE_ADDR"])) {
        $cip = $_SERVER["REMOTE_ADDR"];
    } else {
        $cip = "无法获取！";
    }
    return $cip;
}


/**
 * 通过表单数据来组装筛选数据,如果是组合查询(_string,logic,complex)
 * 就自己到外面去组合
 * @param array $filterRuleArr 筛选规则数组
 * 示例：
 * $filterRuleArr = array(
 *      'nick_name' => array('=', $_REQUEST['name']),   //等于操作
'mobile' => array('eq', $_REQUEST['mobile']),   //等于操作
'userId' => array('in',$_REQUEST['uids']),      //in操作，参数传数组或字符串
'title' => array('like', $_REQUEST['title']),   //传字符串，和tp写法一样
'age' => array('gt',$_REQUEST['age']),          //大于操作
'start_time' => array('egt',$_REQUEST['start_time']),   //大于等于
'end_time' => array('lt', $_REQUEST['end_time']),       //小于
'score' => array('exp', 'score+1'),             //操作
)
 *
 * @return array|null
 */
function getFilterCondition($filterRuleArr)
{
    if (empty($filterRuleArr) || !is_array($filterRuleArr)) {
        return null;
    }

    //查询表达式的关键字,用来验证外部传入的查询表达式是否合法
    $parttern = array(
        'eq','neq','gt','egt','lt','elt',
        'like','not like','between','not between',
        'in','not in','exp'
    );

    //查询条件
    $condition = array();
    foreach ($filterRuleArr as $filed => $rule)
    {
        $exp = strtolower($rule[0]);    //查询筛选表达式eq,neq,gt等
        $value = remove_xss($rule[1]);  //查询条件的值

        if(empty($value)) { //如果查询条件的值为空，就直接跳过
            continue;
        }

        if(empty($filed)) {
            throw_exception('字段名不能为空！');
        }
        if (empty($exp)) {  //如果查询表达式为空或者在
            throw_exception('查询表达式不能为空！');
        }
        if (!in_array($exp,$parttern)) {
            throw_exception('表达式不合法！');
        }

        if ($exp == 'like') {
            $rule = array('like',"%{$value}%");
        }

        $condition[$filed] = $rule;
    }

    return $condition;
}

/**
 *
 * print_r输出
 * @param mixed $value 值
 * @param string $title 显示值前面的标题
 */
function cprint($value, $isEnd = false) {
    echo '<pre>';
    print_r($value);
    echo '</pre>';

    if ($isEnd) {
        exit();
    }
}

/**
 *
 * var_dump输出
 * @param mixed $value 值
 * @param string $title 显示值前面的标题
 */
function cdump($value, $isEnd = false) {
    var_dump($value);

    if ($isEnd) {
        exit();
    }
}

/**
 * 对二维数组按照某个字段进行排序
 * @param array $datas      二维数组数据源
 * @param string $sortKey   按某个字段排序的字段名
 * @param int $sortOrder    排序方式
 * @param int $sortType     排序类型
 * return array
 */
function arrayMultiSort($datas, $sortKey, $sortOrder = SORT_DESC,$sortType = SORT_NUMERIC)
{
    if (!is_array($datas)) {
        return false;
    }

    $sortKeyArr = array();
    foreach ($datas as $d) {
        if (is_array($d) ) {
            $sortKeyArr[] = $d[$sortKey];
        } else {
            continue;
        }
    }
    array_multisort($sortKeyArr,$sortOrder,$sortType,$datas);

    return $datas;
}

/**
 * 自定义抛出异常
 * @param string $msg 异常信息
 * @param string $code 异常代码
 */
function throwException($msg,$code)
{
    throw_exception($msg,'ThinkException',$code);
}

/**
 * 在金额数据入库之前，将金额单位由元转换成分
 * @param   float  $money	要转换的金额数据
 * @return  int    $money   转换成分后的数据
 */
function convertMoneyToFen($money) {
    //$money = intval($money * 100);
    $money = round(floatval($money) * 100);
    return $money;
}

/**
 * 从数据库取出数据后，将金额单位由分转换成元
 * @param   int    $money	  要转换的金额数据
 * @return  float  $money    转换成元后的数据
 */
function convertMoneyToYuan($money) {
    $money = floatval($money / 100);
    return number_format($money, 2, '.', '');
}
function p($var = '')
{
    echo '<pre>';
    print_r($var);
    echo '</pre>';
    exit;
}

/**
 *
 * 获取和设置配置变量
 * @param string $name 配置项的名字
 * @param string|array $value 配置项的值
 */
function config($name = "", $value = null)
{
    static $_config = array();

    //如果没参数，就取全部配置数据
    if (empty($name)) {
        if (!empty($value)) {
            $_config = array_merge($_config, array_change_key_case($value));
        }
        return $_config;
    }

    // 避免非法参数
    if (!is_string($name)) {
        return null;
    }

    if (!strpos($name, '.')) {
        $name = strtolower($name);
        if (is_null($value)) {
            return isset($_config[$name]) ? $_config[$name] : null;
        }
        $_config[$name] = $value;
        return;
    }


    // 二维数组设置和获取支持
    $name = explode('.', $name);
    $name[0] = strtolower($name[0]);
    if (is_null($value)) {
        return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
    }
    $_config[$name[0]][$name[1]] = $value;
    return;
}
